import sensor, image, time,math,screen
from pyb import LED
from pyb import UART

sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)#设置摄像头灰度模式
sensor.set_framesize(sensor.QQVGA)#设置分辨率160*120
sensor.set_contrast(3)  #设置对比度，范围-3~3
uart = UART(3, 115200)
red_led=LED(1)
green_led=LED(2)
blue_led=LED(3)


num_quantity=8  #数字的数量
num_model=[]    #存储数字模型图片的列表
#这里的数字图片模型高度40pix
for n in range(1,num_quantity+1):#循环将根目录下F文件夹的数字图片载入
    num_model.append(image.Image('/S/'+str(n)+'.pgm'))

clock = time.clock()    #声明时钟，用于计帧速

screen.init(40)
img_colorful=sensor.alloc_extra_fb(160,120,sensor.GRAYSCALE)   #声明一个彩色画布，用于屏幕显示
img_to_matching=sensor.alloc_extra_fb(35,45,sensor.GRAYSCALE)   #声明小尺寸画布，用于模板匹配
threshold=(0, 70)#找色块阈值

scale=1 #缩放比例变量

while(True):
    clock.tick()    #用于计帧速，要在循环开头运行一次
    img = sensor.snapshot() #获取摄像头画面
    red_led.on()
    green_led.on()
    blue_led.on()
    blobs = img.find_blobs([threshold]) #按阈值寻找色块，将结果装入blobs。结果可能为多组数据
    if blobs:   #如果blobs有效
     for blob in blobs: #依次循环每个色块
        if blob.pixels()>50 and 100>blob.h()>10 and blob.w()>3:#色块尺寸过滤
            scale=40/blob.h()#通过色块尺寸，计算需要的缩放比例
            #按坐标和比例提取出色块（即摄像头拍到的数字）。注意坐标长宽各扩大4个像素，避免图像不完整。
            img_to_matching.draw_image(img,0,0,roi=(blob.x()-2,blob.y()-2,blob.w()+4,blob.h()+4),x_scale=scale,y_scale=scale)
            for n in range(0,num_quantity):
                #用所有数字模型和它做匹配
                r = img_to_matching.find_template(num_model[n], 0.7, step=2, search=image.SEARCH_EX) #, roi=(10, 0, 60, 60))
                if r:#如果有匹配结果
                    img.draw_rectangle(blob[0:4],color=0)
                    img.draw_string(blob[0],blob[1],str(n+1))
                    num = n+1
                    output_str="target=%d!" % (num)
                    uart.write(output_str)
                    #time.sleep_ms(10)
    img_colorful.draw_image(img,0,0)
    img_colorful.draw_string(0,0,str(round(clock.fps(),2)))
    screen.display(img_colorful)

'''这几句代码相比上面几句屏幕输出代码一样，但因为缩进问题导致其帧率慢好多
    img_colorful.draw_image(img,0,0)
    img_colorful.draw_string(0,0,str(round(clock.fps(),2)))
    screen.display(img_colorful)
'''
